from typing import List

from redis import Redis

from ..graph.base import BaseGraph
from ..graph.nodes import *
from ..models.graph import GraphRequest
from ..parser.xml_parser import XmlToolResultParser


class BlogRunGraph(BaseGraph):
    """
    专业的博客内容管理AI助手。专门处理CSDN、博客园、StackOverflow、GitHub等网站的链接内容分析。

    优先级规则：
    - 如果用户问题只包含一个链接，优先使用此助手
    - 如果用户要求运行或分析链接内容，优先使用此助手

    重要限制：
    - 必须包含具体的链接地址才能使用此助手
    - 不接收纯文本描述的博客相关问题（如"博客页面"、"博客系统"、"博客主页"等）

    系统会根据用户输入的问题自动分析并设置以下参数：
    - url (必选): 基于用户问题提取出博客链接地址，比如:
      * https://blog.csdn.net/xxx/article/details/xxxxx
      * https://www.cnblogs.com/xxx/p/xxxxx.html
      * https://stackoverflow.com/questions/xxxxx
      * https://github.com/xxx/xxx
    """

    def __init__(self,
                 redis: Redis = None,
                 nodes: List[BaseNodes] = [],
                 graph_name="agent_blog_",
                 agent_template: str = "agent_blog",
                 **kwargs):
        super().__init__(graph_name=graph_name,
                         agent_template=agent_template,
                         redis=redis,
                         **kwargs)
        nodes = nodes if nodes else []
        web_node = WebNodes()
        self.nodes = nodes if nodes else [CompletionNodes(),
                                          FileNodes().write_to_file,
                                          web_node.load_doc_from_web,
                                          ProjectNodes()]
        self.parser = XmlToolResultParser(tools=self.get_nodes_schema())

    async def get_system_template(self, request: GraphRequest, state=None, template_type: str = None):
        """
        Override base implementation to add blog-specific default values.
        """
        if "docker_images" not in request.kwargs:
            request.kwargs["docker_images"] = ""
        if "project_templates" not in request.kwargs:
            request.kwargs["project_templates"] = ""

        return await super().get_system_template(request=request, state=state, template_type=template_type)
